package com.softeem.sanguo;

import javazoom.jl.decoder.JavaLayerException;
import javazoom.jl.player.Player;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Random;

/**
 * 公共工具类，主要用于将一些常见的工具方法统一封装：
 * 1. 图片读取
 * 2. 随机生成
 * 3. 碰撞检测
 * 4. 音效播放
 * 5...
 */
public class Utils {

    /**
     * 加载指定名称的图片为BufferedImage对象
     * @param name
     * @return
     */
    public static BufferedImage loadImg(String name){
        try {
            //读取指定地址的图片资源为url对象
            URL url = Utils.class.getResource("/img/"+name);
            //返回图片对象
            return ImageIO.read(url);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 音效播放方法
     * @param name 需要播放个歌曲名
     * @param loop 是否循环播放
     */
    public static void playMusic(String name,boolean loop){
        //使用线程播放音乐
        new Thread(()->{
            //根据参数决定是否循环播放音效
            do{
                //获取指定资源为一个流
                InputStream in = Utils.class.getResourceAsStream("/music/"+name);
                try {
                    //基于输入流获取一个播放器对象
                    Player player  = new Player(in);
                    //播放音效
                    player.play();
                } catch (JavaLayerException e) {
                    throw new RuntimeException(e);
                }
            }while(loop);
        }).start();
    }

    /**
     * 根据提供的min~max之间的数值，进行范围数值随机
     * @param min   最小值
     * @param max   最大值
     * @return 返回介于min和max之间的整数值（可以作为随机坐标，随机攻击力，血量等）
     */
    public static int randomNum(int min,int max){
        //创建一个随机数工具对象
        Random r = new Random();
        //随机获取min~max之间的值
        return r.nextInt(max - min + 1) + min;
    }

    /**
     * 碰撞检测方法，提供构建矩形的相关参数，判断两个矩形是否相交（判断是否碰撞）
     * @param x1
     * @param y1
     * @param w1
     * @param h1
     * @param x2
     * @param y2
     * @param w2
     * @param h2
     * @return
     */
    public static boolean isHit(int x1,int y1,int w1,int h1,int x2,int y2,int w2,int h2){
        //根据提供的参数构建两个矩形对象
        Rectangle r1 = new Rectangle(x1,y1,w1,h1);
        Rectangle r2 = new Rectangle(x2,y2,w2,h2);
        //判定两个矩形是否相交，并将结果作为是否产生碰撞的结果返回
        return r1.intersects(r2);
    }
}
